/**
 * metadataService.js
 * 提供医学影像查看器的DICOM元数据处理功能
 * 从ViewerPage.vue和viewerService.js中提取，专注于元数据提取和格式化
 */

import cornerstone from 'cornerstone-core';

/**
 * 提取图像元数据
 * @param {Object} image - Cornerstone图像对象
 * @returns {Object} 提取的元数据
 */
export function extractMetadata(image) {
  if (!image || !image.data) {
    return {
      success: false,
      error: '无效的图像对象',
      metadata: null
    };
  }
  
  try {
    // 提取基本元数据
    const metadata = {
      modality: image.data.string('x00080060') || 'Unknown',
      seriesNumber: image.data.string('x00200011') || '',
      instanceNumber: image.data.string('x00200013') || '',
      thickness: image.data.string('x00180050') || '',
      position: image.data.string('x00201041') || '',
      sliceLocation: image.data.string('x00201041') || '',
      rows: image.rows,
      columns: image.columns,
      pixelSpacing: {
        row: image.rowPixelSpacing || 1,
        column: image.columnPixelSpacing || 1
      }
    };
    
    // 添加窗宽窗位信息
    metadata.windowWidth = image.windowWidth || 400;
    metadata.windowCenter = image.windowCenter || 40;
    
    // 如果是数组，取第一个值
    if (Array.isArray(metadata.windowWidth)) {
      metadata.windowWidth = metadata.windowWidth[0];
    }
    if (Array.isArray(metadata.windowCenter)) {
      metadata.windowCenter = metadata.windowCenter[0];
    }
    
    return {
      success: true,
      metadata
    };
  } catch (error) {
    console.error('提取元数据失败:', error);
    return {
      success: false,
      error: error.message || '提取元数据失败',
      metadata: null
    };
  }
}

/**
 * 更新图像元数据
 * @param {number} index - 图像索引
 * @param {Array<string>} imageIds - 图像ID数组
 * @param {HTMLElement} viewportElement - 视口元素
 * @returns {Object|null} - 图像元数据
 */
export function updateImageMetadata(index, imageIds, viewportElement) {
  if (index < 0 || index >= imageIds.length) return null;
  
  try {
    const imageId = imageIds[index];
    
    // 对于模拟图像，创建模拟元数据
    if (imageId.startsWith('mock://')) {
      return {
        modality: 'MR',
        seriesNumber: '1',
        instanceNumber: (index + 1).toString(),
        thickness: '3.0',
        position: ''
      };
    }
    
    // 对于真实图像，尝试获取元数据
    try {
      // 使用cornerstone.getImage获取当前显示的图像
      const image = cornerstone.getImage(viewportElement);
      
      if (image && image.data) {
        const result = extractMetadata(image);
        return result.success ? result.metadata : null;
      } else {
        return null;
      }
    } catch (error) {
      console.error('获取图像元数据失败:', error);
      return null;
    }
  } catch (error) {
    console.error('更新图像元数据失败:', error);
    return null;
  }
}

/**
 * 格式化序列标签
 * @param {Object} series - 序列对象
 * @returns {string} 格式化后的序列标签
 */
export function formatSeriesLabel(series) {
  const description = series.MainDicomTags.SeriesDescription || '未命名序列';
  const number = series.MainDicomTags.SeriesNumber || '';
  return `${number} - ${description}`;
}

/**
 * 格式化日期
 * @param {string} dateStr - 日期字符串，例如 "20200101"
 * @returns {string} 格式化后的日期，例如 "2020-01-01"
 */
export function formatDate(dateStr) {
  if (!dateStr) return '';
  
  // 格式化日期，例如从 "20200101" 转换为 "2020-01-01"
  if (dateStr.length === 8) {
    return `${dateStr.substring(0, 4)}-${dateStr.substring(4, 6)}-${dateStr.substring(6, 8)}`;
  }
  
  return dateStr;
}

/**
 * 格式化检查日期和时间
 * @param {string} dateStr - 日期字符串，例如 "20200101"
 * @param {string} timeStr - 时间字符串，例如 "120000"
 * @returns {string} 格式化后的日期和时间，例如 "2020-01-01 12:00:00"
 */
export function formatStudyDateTime(dateStr, timeStr) {
  let result = '';
  
  // 格式化日期
  if (dateStr && dateStr.length === 8) {
    result += `${dateStr.substring(0, 4)}-${dateStr.substring(4, 6)}-${dateStr.substring(6, 8)}`;
  } else if (dateStr) {
    result += dateStr;
  }
  
  // 添加时间（如果有）
  if (timeStr && timeStr.length >= 6) {
    result += ` ${timeStr.substring(0, 2)}:${timeStr.substring(2, 4)}:${timeStr.substring(4, 6)}`;
  }
  
  return result || 'Unknown';
}

/**
 * 格式化检查描述信息
 * @param {Object} study - 检查对象
 * @returns {string} 格式化后的检查描述
 */
export function formatStudyDescription(study) {
  if (!study || !study.MainDicomTags) return 'Unknown Study';
  
  const description = study.MainDicomTags.StudyDescription || '';
  const modalities = study.MainDicomTags.ModalitiesInStudy || '';
  const numImages = study.MainDicomTags.NumberOfStudyRelatedInstances || study.MainDicomTags.NumberOfSeriesRelatedInstances || '';
  
  let result = description;
  
  if (modalities) {
    result += ` (${modalities})`;
  }
  
  if (numImages) {
    result += ` - ${numImages} images`;
  }
  
  return result || 'Unknown Study';
}

export default {
  extractMetadata,
  updateImageMetadata,
  formatSeriesLabel,
  formatDate,
  formatStudyDateTime,
  formatStudyDescription
} 